package edu.hrbu.trade01.controller;

import cn.hutool.core.util.RandomUtil;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import edu.hrbu.trade01.entity.Buyer;
import edu.hrbu.trade01.service.BuyerService;
import edu.hrbu.trade01.util.R;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;

import java.util.concurrent.TimeUnit;

import static edu.hrbu.trade01.util.ConstUtil.*;

/**
 * @author 徐登宇
 */
@Slf4j
@RestController
@RequestMapping("/buyer")
public class BuyerController {

    @Autowired
    private StringRedisTemplate redisTemplate;

    @Resource(name = "buyerServiceImpl")
    private BuyerService buyerService;

    // 通过手机号创建新用户
    private Buyer createNewBuyer(String tel) {
        Buyer buyer = new Buyer();
        buyer.setTel(tel);
        String name = BUYER_RANDOM_LOGIN_NAME_PRE + RandomUtil.randomString(6);
        buyer.setName(name);
        buyer.setBalance(0F);

        return buyer;
    }

    /**
     * 通过手机号发送短信验证码
     * 写入缓存
     * 如果是新用户，先写入数据库再写入缓存
     * <p>
     * 验证码长度：6
     * 验证码的超时时间：3min
     *
     * codeKey：one.getName() + ":" + BUYER_LOGIN_CODE
     *
     *
     * @param tel 手机号
     * @return R
     */
    @Transactional
    @PostMapping("/send/code/{tel}")
    public R sendCode(@PathVariable("tel") String tel) {

        if (StrUtil.isNotBlank(tel) && tel.length() == 11) {
            Buyer one = buyerService.getOne(new LambdaQueryWrapper<Buyer>().eq(Buyer::getTel, tel));
            if (one == null) {
                // 数据库中没有：是新用户，我们新建出来
                one = createNewBuyer(tel);
                // 写进数据库
                buyerService.save(one);
            }

            // 随机生成验证码
            String code = RandomUtil.randomNumbers(6);
            String codeKey = one.getName() + ":" + BUYER_LOGIN_CODE;

            // 写进缓存，并设置超时时间为1min
            redisTemplate.opsForValue().set(codeKey, code, BUYER_LOGIN_CODE_TTL, TimeUnit.SECONDS);
            return R.ok(code);
        }
        return R.fail("请正确的输入手机号");
    }

    /**
     * 登录：通过手机号+验证码
     *
     * 先判断手机号是否为空以及格式是否正确
     * 再判断手机号在数据库中是否存在
     * 通过手机号获取name，通过name组装成codeKey获取code
     * 判断code是否存在以及正确
     *
     * @param tel 手机号
     * @param code 验证码
     * @return R
     */
    @PostMapping("/login/{tel}/{code}")
    public R login(@PathVariable("tel") String tel, @PathVariable("code") String code) {
//        log.error("登录者信息 {}", buyer);
//        log.error("登录的验证码{}", code);
        // 校验数据是否为空
        if (StrUtil.isBlank(tel)) return R.fail("登录数据不可为空");
        // 判断手机号格式
        if (tel.length()!=11) return R.fail("手机号格式错误！");
        // 判断是否有该手机号数据
        Buyer one = buyerService.getOne(new LambdaQueryWrapper<Buyer>().eq(Buyer::getTel, tel));
        if (one==null) return R.fail("该手机号为新用户！请先注册");
        // 通过手机号获取name
        String buyerName = one.getName();
        String codeKey=buyerName+":"+BUYER_LOGIN_CODE;
        // 从缓存中获取code
        String cacheCode = redisTemplate.opsForValue().get(codeKey);
        if (StrUtil.isBlank(cacheCode)) return R.fail("验证码已失效！");
        if (!cacheCode.equals(code)) return R.fail("验证码错误！");

        return R.ok(one);
    }



}
